package com.mrx.commons.annotations;

import com.mrx.commons.aop.enums.LockType;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 分布式锁 注解
 *
 * @author Mr.X
 * @since 2023-11-15 17:12
 **/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface XLock {

    /**
     * 加锁用的 key
     */
    String value();


    /**
     * 每次等待时间<br/>
     * {@link #lockType()} 为 {@link LockType#WAIT_LOCK} 时才会生效
     */
    int sleepMills() default 1000;

    /**
     * 重试次数<br/>
     * {@link #lockType()} 为 {@link LockType#WAIT_LOCK} 时才会生效
     */
    int retryTimes() default 3;

    /**
     * 最长等待时间
     * {@link #lockType()} 为 {@link LockType#WAIT_LOCK} 时才会生效
     */
    int maxWaitTime() default 4000;

    /**
     * 无法获得锁时抛出的异常 message 内容<br/>
     * 当 {@link #lockType()} 为 {@link LockType#MUTEX_LOCK} 时才会生效
     */
    String lockedMessage() default "";

    /**
     * 锁的类型
     *
     * @see LockType
     */
    LockType lockType() default LockType.WAIT_LOCK;
}
